<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
<script>
	function objectPlus(o, stuff) {
		var n;
		function F() {};
		F.prototype = o;
		n = new F();
		n.uber = o;

		for(var i in stuff){
			n[i] = stuff[i];
		}
		return n;
	}

	// 这个函数接受两个参数，其中对象o用于继承，而另一个对象stuff则用于拷贝方法与属性，下面我们来看看实际应用。
	// 首先，需要一个基本对象shape
	var shape = {
		name: 'shape',
		toString: function(){
			return this.name;
		}
	};

	// 接着再创建一个继承于shape的2D对象，并为其添加给更多的属性。这些额外的属性有一个用文本表示法所创建的匿名对象提供
	var twoDee = objectPlus(shape, {
		name: '2D shape',
		toString: function() {
			return this.uber.toString() + ', ' +this.name;
		}
	});

	// 现在，我们来创建一个继承于2D对象的triangle对象，并为其添加一些额外的属性。
	var triangle = objectPlus(twoDee, {
		name: 'Triangle',
		getArea: function() {
			return this.side * this.height / 2;
		},
		side: 0,
		height: 0
	});

	// 下面我们来测试一下：创建一个具体的triangle对象my，并自定义其side和height属性。
	var my = objectPlus(triangle, {
		side: 4,
		height: 4
	});

	console.log(my.getArea());
	console.log(my.toString());

	// 这里的不同之处在于，当toString()函数被执行时候，Trangle的name属性会被重复两次。这是因为我们在具现化实例时继承于triangle对象的，所以这里多了一层继承关系。我们也可以给该实例一个新的name属性。例如
	console.log(objectPlus(triangle, {
		side: 4,
		height: 4,
		name: 'My 4x4'
	}).toString());

	// 这里的objectPlus()函数的实现方式比起之前提到的object()更接近es5的Object.create()。只是ES5中，附加属性是通过属性描述提供的
</script>
</body>
</html>